package service

import (
	"bloggo/structs"
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
)

//SaveTbFriendLinkStruct 保存
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveTbFriendLinkStruct(ctx context.Context, tbfriendlinkstruct *structs.TbFriendLinkStruct) error {

	// tbfriendlinkstruct对象指针不能为空
	if tbfriendlinkstruct == nil {
		return errors.New("tbfriendlinkstruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveTbFriendLinkStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveTbFriendLinkStruct := zorm.Insert(ctx, tbfriendlinkstruct)

		if errSaveTbFriendLinkStruct != nil {
			return nil, errSaveTbFriendLinkStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveTbFriendLinkStruct != nil {
		errSaveTbFriendLinkStruct := fmt.Errorf("service.SaveTbFriendLinkStruct错误:%w", errSaveTbFriendLinkStruct)
		logger.Error(errSaveTbFriendLinkStruct)
		return errSaveTbFriendLinkStruct
	}

	return nil
}

//UpdateTbFriendLinkStruct 更新
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateTbFriendLinkStruct(ctx context.Context, tbfriendlinkstruct *structs.TbFriendLinkStruct) error {

	// tbfriendlinkstruct对象指针或主键Id不能为空
	if tbfriendlinkstruct == nil || tbfriendlinkstruct.Id < 1 {
		return errors.New("tbfriendlinkstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbFriendLinkStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbFriendLinkStruct := zorm.Update(ctx, tbfriendlinkstruct)

		if errUpdateTbFriendLinkStruct != nil {
			return nil, errUpdateTbFriendLinkStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbFriendLinkStruct != nil {
		errUpdateTbFriendLinkStruct := fmt.Errorf("service.UpdateTbFriendLinkStruct错误:%w", errUpdateTbFriendLinkStruct)
		logger.Error(errUpdateTbFriendLinkStruct)
		return errUpdateTbFriendLinkStruct
	}

	return nil
}

//UpdateNotZeroTbFriendLinkStruct 更新
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroTbFriendLinkStruct(ctx context.Context, tbfriendlinkstruct *structs.TbFriendLinkStruct) error {

	// tbfriendlinkstruct对象指针或主键Id不能为空
	if tbfriendlinkstruct == nil || tbfriendlinkstruct.Id < 1 {
		return errors.New("tbfriendlinkstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbFriendLinkStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbFriendLinkStruct := zorm.UpdateNotZeroValue(ctx, tbfriendlinkstruct)

		if errUpdateTbFriendLinkStruct != nil {
			return nil, errUpdateTbFriendLinkStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbFriendLinkStruct != nil {
		errUpdateTbFriendLinkStruct := fmt.Errorf("service.UpdateNotZeroTbFriendLinkStruct错误:%w", errUpdateTbFriendLinkStruct)
		logger.Error(errUpdateTbFriendLinkStruct)
		return errUpdateTbFriendLinkStruct
	}

	return nil
}

//DeleteTbFriendLinkStructById 根据Id删除
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteTbFriendLinkStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteTbFriendLinkStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.TbFriendLinkStructTableName).Append(" WHERE id=?", id)
		_, errDeleteTbFriendLinkStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteTbFriendLinkStruct != nil {
			return nil, errDeleteTbFriendLinkStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteTbFriendLinkStruct != nil {
		errDeleteTbFriendLinkStruct := fmt.Errorf("service.DeleteTbFriendLinkStruct错误:%w", errDeleteTbFriendLinkStruct)
		logger.Error(errDeleteTbFriendLinkStruct)
		return errDeleteTbFriendLinkStruct
	}

	return nil
}

//FindTbFriendLinkStructById 根据Id查询信息
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbFriendLinkStructById(ctx context.Context, id string) (*structs.TbFriendLinkStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.TbFriendLinkStructTableName).Append(" WHERE id=?", id)
	tbfriendlinkstruct := structs.TbFriendLinkStruct{}
	has, errFindTbFriendLinkStructById := zorm.QueryRow(ctx, finder, &tbfriendlinkstruct)

	//记录错误
	if errFindTbFriendLinkStructById != nil {
		errFindTbFriendLinkStructById := fmt.Errorf("service.FindTbFriendLinkStructById错误:%w", errFindTbFriendLinkStructById)
		logger.Error(errFindTbFriendLinkStructById)
		return nil, errFindTbFriendLinkStructById
	}

	if !has {
		return nil, nil
	}

	return &tbfriendlinkstruct, nil

}

//FindTbFriendLinkStructList 根据Finder查询列表
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbFriendLinkStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.TbFriendLinkStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	tbfriendlinkstructList := make([]structs.TbFriendLinkStruct, 0)
	errFindTbFriendLinkStructList := zorm.Query(ctx, finder, &tbfriendlinkstructList, page)

	//记录错误
	if errFindTbFriendLinkStructList != nil {
		errFindTbFriendLinkStructList := fmt.Errorf("service.FindTbFriendLinkStructList错误:%w", errFindTbFriendLinkStructList)
		logger.Error(errFindTbFriendLinkStructList)
		return nil, errFindTbFriendLinkStructList
	}

	return tbfriendlinkstructList, nil
}
